package com.jooq.example.config.db.aop;

import com.jooq.example.config.db.dds.DynamicDataSourceHolder;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

/**
 * 数据源AOP切面定义
 * <code>@Order(-10)</code> 保证切面在事物前执行
 */
@Component
@Order(-10)
@Aspect
@Slf4j
public class DataSourceAspect {

    @Before("@annotation(targetDataSource)")
    public void changeDataSource(JoinPoint point, TargetDataSource targetDataSource) throws Throwable {
        //获取当前的指定的数据源;
        String dataSource = targetDataSource.value();
        log.info("当前使用数据源 : {} > 方法： {} ", dataSource, point.getSignature());
        //找到的话，那么设置到动态数据源上下文中。
        DynamicDataSourceHolder.putDataSource(targetDataSource.value());
    }

    @After("@annotation(targetDataSource)")
    public void restoreDataSource(JoinPoint point, TargetDataSource targetDataSource) {
        log.info("回收数据源 : {} > 方法： {}", targetDataSource.value(), point.getSignature());
        //方法执行完毕之后，销毁当前数据源信息，进行垃圾回收。
        DynamicDataSourceHolder.removeDataSource();
    }
}
